#!/bin/bash
## -------------------------
#    log_data_roll_backup_manager.sh
#   循环存储日志
#       所有日志备份到日志存储服务器 /data目录下，当/data 使用率大于90%时，查看其他/data n 盘是否使用率大于90%
#       1、/data n磁盘空间已满，检查下一块磁盘，直到检查完全部 /data n
#       2、/data n磁盘空间未满，rsync 同步/data 最早那天的数据到 /data n 盘的相同位置，退出
#       3、所有/data n 磁盘均满时，把所有日志文件中，最早那天的日志删除，
#       然后rsync 同步/data 最早那天的数据到 /data n 盘的相同位置，退出
#
### crontab -e
#
# # 收集前天日志目录，保存在/data/script/log_date/yyyymmdd, 用于自动转存日志
#   0 1 * * * /bin/bash /data/script/log_data_roll_backup_manager.sh register
# #每10分钟检查一次/data盘使用率是否大于90%，大于90%则进行转存
#   */10 * * * * /bin/bash /data/script/log_data_roll_backup_manager.sh percent >> /tmp/check_used_percent_of_data0.log 2>&1

# 磁盘名称列表
DataList=$(df -h|awk '/data/ {print $6}')
# 磁盘数
DataNum=$(df -h|grep -c data)

LogDate='/data/script/log_date'

# /data 最早日志文件
TheOldestLogsOfData0=$(find $LogDate -type f|grep 'data0' |sort|head -1)
# 所有/data N 下 最早日志文件
TheOldestLogsOfAll=$(find $LogDate -type f|sort|head -1)



# 检查变量是否有值
function check_valid_of_var(){
	if [ -d "$1" ]
	then
		exit 110
	else
		echo $1
	fi
}


# 检查磁盘使用率
function check_disk_used_percent(){
    percent=$(df -h $1|grep "$1"|awk -F'[\\%| ]' '{print $(NF-2)}')
    echo "$percent"
}


function mv_files(){
	
	for file in $(cat $TheOldestLogsOfData0)
	do
		check_valid_of_var $file
		#rsync -aP $file "${file/data/$disk}"
		echo "rsync -aP $file ${file/data/${disk#*/}}"
		if [ $? -eq 0 ]
		then
			echo "rm $file"
			#rm $file
		else
			echo "$(date) : mv $file to $disk error"
		fi
	done
	
	#更新日志文件当前路径
	sed "s@/data@$disk@" $TheOldestLogsOfData0
	#sed -i "s@/data@$disk@" $TheOldestLogsOfData0

	#重命名日志索引文件
	echo "mv $TheOldestLogsOfData0 ${TheOldestLogsOfData0/data0/${disk#*/}}"
	#mv $TheOldestLogsOfData0 ${TheOldestLogsOfData0/data0/${disk#*/}}
	
    exit 0
}


function rm_files(){
	
	for file in $(cat $TheOldestLogsOfData0)
	do 
		check_valid_of_var $file
		#rm -f $file
		echo "rm $file"
	done
	
	# 删除日志索引文件
	echo "rm -f $TheOldestLogsOfData0"
	#rm -f $TheOldestLogsOfData0
	
	exit 0
}


function log_data_roll_backup_manager(){
	FullDiskNum=0
	for disk in $DataList
	do
		
		check_disk_used_percent $disk
	
		# 判断各磁盘使用率是否大于90%
		if [[ $percent -ge 90 ]];then
			FullDiskNum=$((FullDiskNum + 1))
		# 避免 从 /data mv 到 /data
		elif [[ $disk == '/data' ]]
		then
			continue
		else
			#磁盘没满就直接转存
			mv_files
		fi
	done

	# 大于90%的磁盘数等于全部的时候，判断哪个盘数据最早，然后删除，然后转存
	if [ $FullDiskNum -eq ${DataNum} ];then
				
		disk="/"$(echo $TheOldestLogsOfData0|awk -F'_' '{print $3}')
		if [ $disk == '/data0' ]
		then
			disk='/data'
			rm_files
		else
			rm_files
			mv_files
		fi
	fi
	
}


#
## 每分钟检查一次/data盘使用率是否大于90%
#
function check_used_percent_of_data0(){
	data_percent=$(df -h /data|grep 'data'|awk -F'[\\%| ]' '{print $(NF-2)}')

	if [ $data_percent -ge 90 ]
	then
		proc_num=$(ps -ef|grep -c 'log_data_roll_backup_manager')
		if [ $proc_num -eq 0 ]
		then
			log_data_roll_backup_manager
		fi
	else
		echo "$(date),OK DATA USAGE : $data_percent"
	fi
	
}



#
## ----------每天创建前天日期文件,并把当天日志目录写进去记录-----------
#
function register_anteayer_logs_of_data0(){
	# YYYYmmdd
	Date_1=$(date +%Y%m%d -d "2 day ago");
	# YYYY-mm-dd
	Date_2=$(date +%F -d "2 day ago");
	# YYYY-m-dd
	Date_3=$(date +%F -d "2 day ago"|awk -F'-' '{printf("%d-%d-%s",$1,$2,$3)}');
	# YYY-m-d
	Date_4=$(date +%F -d "2 day ago"|awk -F'-' '{printf("%d-%d-%d",$1,$2,$3)}');
	find /data -type f -name '*.gz'|egrep "${Date_1}|${Date_2}|${Date_3}|${Date_4}\.|${Date_4}-" |egrep -v \
	'/data/test|/data/SvnBackup|/data/vsftp|/data/tmp|/data/temp|/data/sh|/data/script' > "$LogDate/${Date_1}_data0"
	
}


#
##	----------注册磁盘上所有日志备份文件的路径信息-----------
# 
function register_all_previous_logs(){
	for data in $DataList
	do
		
		find $data -type f -name '*.gz' > $LogDate/all_previous_logs
		
   		for i in {2..60}
		do
			# YYYYmmdd
			Date_1=$(date +%Y%m%d -d "$i day ago");
			# YYYY-mm-dd
			Date_2=$(date +%F -d "$i day ago");
			# YYYY-m-dd
			Date_3=$(date +%F -d "$i day ago"|awk -F'-' '{printf("%d-%d-%s",$1,$2,$3)}');
			# YYY-m-d
			Date_4=$(date +%F -d "$i day ago"|awk -F'-' '{printf("%d-%d-%d",$1,$2,$3)}');
			
			if [ ${data} == '/data' ]
			then
				egrep "${Date_1}|${Date_2}|${Date_3}|${Date_4}\.|${Date_4}-" $LogDate/all_previous_logs|egrep -v \
				"${data}/test|${data}/SvnBackup|${data}/vsftp|${data}/tmp|${data}/temp|${data}/sh|${data}/script" > "$LogDate/${Date_1}_${data#*/}0"
			else
				egrep "${Date_1}|${Date_2}|${Date_3}|${Date_4}\.|${Date_4}-" $LogDate/all_previous_logs|egrep -v \
				"${data}/test|${data}/SvnBackup|${data}/vsftp|${data}/tmp|${data}/temp|${data}/sh|${data}/script" > "$LogDate/${Date_1}_${data#*/}"
			fi
		done
	done
	
	#删除 空文件
	cd $LogDate;ls -lh|grep 'root root    0'|awk '{print $9}'|xargs -i rm {}
	#删除临时文件
	rm $LogDate/all_previous_logs
}



if [[ 'percent' == $1 ]]
then
	check_used_percent_of_data0
elif [[ 'register' == $1 ]]
then
	register_anteayer_logs_of_data0
elif [[ 'registerAll' == $1 ]]
then
	register_all_previous_logs
else
	echo "usage : $0 percent（监测磁盘使用率）|register(注册前天日志路径)|registerAll(注册前天之前所有日志路径)"
fi